package org.mbcorp.sar.controller;

import java.security.Principal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.mbcorp.sar.model.Area;
import org.mbcorp.sar.model.ListasEmail;
import org.mbcorp.sar.model.Solicitud;
import org.mbcorp.sar.model.TipoRequerimiento;
import org.mbcorp.sar.service.AlertaService;
import org.mbcorp.sar.service.ArchivoService;
import org.mbcorp.sar.service.AreaService;
import org.mbcorp.sar.service.SolicitudService;
import org.mbcorp.sar.service.TipoRequerimientoService;
import org.mbcorp.sar.validator.SolicitudValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.context.MessageSource;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@PreAuthorize(value = "hasRole('ROLE_CLIENTE')")
@Controller
public class GestionarSolicitudesController {

	@Autowired
    private MessageSource messageSource;

	@Autowired
	private SolicitudService solicitudService;
	
	@Autowired
	private AreaService areaService;
	
	@Autowired
	private ArchivoService archivoService;
	
	@Autowired
	private AlertaService alertaService;
	
	@Autowired
	private TipoRequerimientoService tipoRequerimientoService;
	
	@Autowired
	private SolicitudValidator solicitudValidator;
	
	@InitBinder
	public void initDateBinder(final WebDataBinder dataBinder, final Locale locale) {
	    final String dateformat = this.messageSource.getMessage("date.format", null, locale);
	    final SimpleDateFormat sdf = new SimpleDateFormat(dateformat);
	    sdf.setLenient(false);
	    dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, false));
	}

//	@RequestMapping(value = "/consultarSolicitudes", method = RequestMethod.GET)
//	public String buscarSolicitudes(Solicitud solicitud) {
//		return "consultarSolicitudes";
//	}
//	
//	@RequestMapping(value = "/consultarSolicitudes", method = RequestMethod.POST)
//	public String mostrarResultados(Model model, Solicitud solicitud, BindingResult result, Principal currentUser) {
//		List<Solicitud> listaSolicitudes;				
//		if(solicitud.isPorNumero()){
//			if(solicitudValidator.validarBusquedaExacta(solicitud, result)){
//				listaSolicitudes = solicitudService.buscarListaPorId(solicitud.getId(), currentUser);
//				model.addAttribute("listaSolicitudes", listaSolicitudes);
//				} else {		    
//				listaSolicitudes = new ArrayList<Solicitud>();
//				model.addAttribute("flagIdError", true);
//				}
//			} else {
//				listaSolicitudes = solicitudService.buscarPorFiltrosAreaEstadoFechaSolicitante(solicitud, currentUser);
//				if(solicitudValidator.validarBusquedaAmplia(solicitud, result)){
//					model.addAttribute("listaSolicitudes", listaSolicitudes);
//				} else {
//					model.addAttribute("flagFechaError", true);
//				}
//			}
//		solicitud.setPorNumero(false);
//		return "consultarSolicitudes";
//	}
	
	@RequestMapping(value = "/registrarSolicitud", method = RequestMethod.GET)
	public String registrarSolicitudForm(Solicitud solicitud, Model model) {
		model.addAttribute("modoConsulta", false);
		return "registrarSolicitud";
	}
	
	@RequestMapping(value = "/registrarSolicitud", method = RequestMethod.POST)
	public String registrarSolicitud(Model model, Solicitud solicitud, BindingResult result, Principal currentUser) {
		if(solicitud.isFlagAdjuntar()){
			solicitudValidator.validarArchivo(solicitud, result);			
		}
		solicitudValidator.validarRegistro(solicitud, result);
		if (!result.hasErrors()){
			Solicitud s = solicitudService.grabar(solicitud, currentUser);
			solicitud.setId(s.getId());
			solicitud.setEstado("Registrado");
			model.addAttribute("modoConsulta", true);
			model.addAttribute("confirmaRegistro", true);			
			alertaService.mandarAlerta(solicitud, ListasEmail.VERIFICADORES);			
		}
		return "registrarSolicitud";
	}

//	@RequestMapping(value = "/consultaSolicitud/{id}", method = RequestMethod.GET)
//	public String mostrarDetalle(@PathVariable Integer id, Model model) {
//		model.addAttribute("modoConsulta", true);
//		Solicitud dto = solicitudService.armarSolicitud(id);
//		model.addAttribute("solicitud", dto);
//	return "registrarSolicitud";
//	   }
	
	@ModelAttribute("allAreas")
	public List<Area> llenarAreas() {
	    return areaService.buscarTodos();
	}
	
	@ModelAttribute("allTipoRequerimientos")
	public List<TipoRequerimiento> llenarTipoRequerimientos() {
	    return tipoRequerimientoService.buscarTodos();
	}
}
